<?php

/**
 * Created by JetBrains PhpStorm.
 * User: taoqili
 * Date: 11-12-28
 * Time: 上午9:54
 * To change this template use File | Settings | File Templates.
 */
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ERROR | E_WARNING);
//远程抓取图片配置
$config = array(
    "savePath" => "upload/", //保存路径
    "allowFiles" => array(".gif", ".png", ".jpg", ".jpeg", ".bmp"), //文件允许格式
    "maxSize" => 3000                    //文件大小限制，单位KB
);
$uri = htmlspecialchars($_POST['upfile']);
$uri = str_replace("&amp;", "&", $uri);
getRemoteImage($uri, $config);

/**
 * 远程抓取
 * @param $uri
 * @param $config
 */
function getRemoteImage($uri, $config) {
    //忽略抓取时间限制
    set_time_limit(0);
    //ue_separate_ue  ue用于传递数据分割符号
    $imgUrls = explode("ue_separate_ue", $uri);
    $tmpNames = array();
    foreach ($imgUrls as $imgUrl) {
        //http开头验证
        if (strpos($imgUrl, "http") !== 0) {
            array_push($tmpNames, "error");
            continue;
        }
        //获取请求头
        $heads = get_headers($imgUrl);
        //死链检测
        if (!( stristr($heads[0], "200") && stristr($heads[0], "OK") )) {
            array_push($tmpNames, "error");
            continue;
        }

        //格式验证(扩展名验证和Content-Type验证)
        $fileType = strtolower(strrchr($imgUrl, '.'));
        if (!in_array($fileType, $config['allowFiles']) || stristr($heads['Content-Type'], "image")) {
            array_push($tmpNames, "error");
            continue;
        }

        //打开输出缓冲区并获取远程图片
        ob_start();
        $context = stream_context_create(
                array(
                    'http' => array(
                        'follow_location' => false // don't follow redirects
                    )
                )
        );
        //请确保php.ini中的fopen wrappers已经激活
        readfile($imgUrl, false, $context);
        $img = ob_get_contents();
        ob_end_clean();

        //大小验证
        $uriSize = strlen($img); //得到图片大小
        $allowSize = 1024 * $config['maxSize'];
        if ($uriSize > $allowSize) {
            array_push($tmpNames, "error");
            continue;
        }
        //创建保存位置
        $savePath = '../../attachments/' . $config['savePath'] . date('Ymd') . '/';
        if (!file_exists($savePath)) {
            mkdir("$savePath", 0777);
        }
        //写入文件
        $tmpName = $savePath . rand(1, 10000) . time() . strrchr($imgUrl, '.');
        try {
            $fp2 = @fopen($tmpName, "a");
            fwrite($fp2, $img);
            fclose($fp2);
            array_push($tmpNames, $tmpName);
        } catch (Exception $e) {
            array_push($tmpNames, "error");
        }
    }
    /**
     * 返回数据格式
     * {
     *   'url'   : '新地址一ue_separate_ue新地址二ue_separate_ue新地址三',
     *   'srcUrl': '原始地址一ue_separate_ue原始地址二ue_separate_ue原始地址三'，
     *   'tip'   : '状态提示'
     * }
     */
    echo "{'url':'" . preg_replace('/..\/..\/attachments\//', '', implode("ue_separate_ue", $tmpNames)) . "','tip':'远程图片抓取成功！','srcUrl':'" . $uri . "'}";
}